# 基线检测模块
import pandas as pd
import pymysql
import pymysql.cursors
import random
import re
from time import *
import hashlib
import os
import numpy as np
import string
'''

模块的输入：处理后的目标主机操作系统、数据库、防火墙和入侵检测的安全策略以及配置
模块的输出：基线检测的结果


'''

from baseline_manage import get_baseline

result = []




'''
测试口令强度
'''


def checkweakcode(code):
    weak = re.compile(r'^((\d+)|([A-Za-z]+)|(\W+))$')
    level_weak = weak.match(code)
    level_middle = re.match(r'([0-9]+(\W+|\_+|[A-Za-z]+))+|([A-Za-z]+(\W+|\_+|\d+))+|((\W+|\_+)+(\d+|\w+))+',code)
    level_strong = re.match(r'(\w+|\W+)+',code)
    if level_weak:
        print ("口令强度是否符合要求:否"),level_weak.group()
    else:
        if (level_middle and len(level_middle.group())==len(code)):
            print ("口令强度是否符合要求:否"),level_middle.group()
        else:
            if level_strong and len(level_strong.group())==len(code):
                print ("口令强度是否符合要求:是"),level_strong.group()

'''
调用checkweakcode进行密码强度检测
'''
def getwindowsmysqlcode():
    f = open("D:\数据库账号密码\mysql.txt",encoding='utf-8')
    while True:
        line = f.readline()
        if line:
            if line.startswith('密'):
                test=line[3:]
                checkweakcode(test)
        else:
            break
    f.close()


'''
linux  and windows下mysql基线检测
'''
def mysql_baselinecheck(result):
    io = r'linux_mysql_checklist.xlsx'   #最后替换成result下的数据库基线txt
    sheet = pd.read_excel(io, sheet_name='Sheet1', header=[0, 1])
    num_rows=len(sheet[sheet.columns[0]])   #计算基线表总行数
    with open("a.txt", "r", encoding="utf-8") as f:
        b = f.read()
    a = b.split('\n')
    # print(a)
    for j in range(0, num_rows):
        data = sheet.loc[j].values  # 0表示第一行 这里读取数据并不包含表头
        # print(data[4])
        # print(data.head())

        # print(a[1])
        i = 0
        for i in range(len(a)):
            if data[4] in a[i]:
                if str(data[5]) in a[i]:
                    with open('m.txt', 'r+', newline='', encoding='utf-8') as f:
                        content = f.read()
                        f.seek(0, 2)
                        f.write('\rdata[1]\tdata[2]\tPass') #某一安全策略和配置具体名称Pass
                    #print(data[2] + 'Pass')
                else:
                    with open('m.txt', 'r+', newline='', encoding='utf-8') as f:
                        content = f.read()
                        f.seek(0, 2)
                        f.write('\rdata[1]\tdata[2]\tFail')  #某一安全策略和配置具体名称 Fail
                    #print(data[2] + ':Fail')




# 接口B3
def baseline_detect(result):
    print('开始基线检测')
    '''
    
    根据result中的每一个文件依次进行检测，并分别将每一个文件检测后结果保存另一个文件，
    分别为os_detect.txt，db_detect.txt，fw_detect.txt，ids_detect.txt
    每一个文件内容格式为
    第一行：object：os/db/fw/ids
    第二行：type：Windows/Linux/........
    第三行：某一安全策略和配置具体名称：Pass/Fail
    第四行：某一安全策略和配置具体名称：Pass/Fail
    .
    .
    .
    
    '''
    print('检测结束')

# 接口A4
def get_detect_result():
    '''

    基线检测模块提供的接口
    该接口返回检测结果

    '''
    return result